#include "data.h"

/* 文件的绝对路径名 */
const char *filePath = "0:/motorTestData.txt";

/* 文件系统方面的定义 */
FIL fil;
FRESULT Res;
UINT bww;


_calendar_obj calendarStart;//时钟结构体_开始时间
_calendar_obj calendarEnd;//时钟结构体_结束时间

/* 存储当前红外传感器检测状态 */
uint8_t infraredState[10] = {1};
/* 存储这个电机转动的总圈数 */
uint32_t motorNum[10] = {0};

/* 不堵塞延时的参数 */
uint32_t thisTime = 0;
uint32_t lastTime[10] = {0};

/*
 *  设置开始时间
 */
void setTimeStart(void)
{
	calendarStart.w_year = calendar.w_year;
	calendarStart.w_month = calendar.w_month;
	calendarStart.w_date = calendar.w_date;
	calendarStart.hour = calendar.hour ;
	calendarStart.min = calendar.min;
	calendarStart.sec = calendar.sec;
}

/*
 *  设置结束时间
 */
void setTimeEnd(void)
{
	calendarEnd.w_year = calendar.w_year;
	calendarEnd.w_month = calendar.w_month;
	calendarEnd.w_date = calendar.w_date;
	calendarEnd.hour = calendar.hour ;
	calendarEnd.min = calendar.min;
	calendarEnd.sec = calendar.sec;
}

/*
 *  将开始时间、结束时间、电机号、运行总圈数写入到字符串中
 *	格式为：开始时间：%d-%d-%d，结束时间：%d-%d-%d，电机号： %2d,运行总圈数：%6d\r\n
 *  例如：开始时间：2024-10-20，结束时间：2024-10-30，电机号：01，运行总圈数：50050  
 */
void setTimeStr(uint8_t *timeStr, uint8_t motorSerialNum)
{
	 sprintf((char *)timeStr, "开始时间：%d-%d-%d, 结束时间：%d-%d-%d, 电机号： %2d, 运行总圈数：%6d\r\n",
	 calendarStart.w_year, calendarStart.w_month, calendarStart.w_date,//开始时间的年月日 
	 calendarEnd.w_year, calendarEnd.w_month, calendarEnd.w_date,//结束时间的年月日
	 motorSerialNum,//电机号
	 motorNum[motorSerialNum]//电机运行总圈数
	 );
}

/*
 * 把字符串数据存储到SD卡中
 */
void setSDCardStr(uint8_t *SDCardStr)
{
	/* 打开文件-追加模式 */
	Res = f_open( &fil, filePath,   FA_OPEN_ALWAYS | FA_WRITE);
	if(Res == FR_OK)
	{
		/* 移动光标到文件末尾 */
		f_lseek(&fil, f_size(&fil));
		/* 写入数据 */
		f_write(&fil, SDCardStr, strlen((const char *)SDCardStr), &bww);
		/* 关闭文件夹 */
		f_close(&fil);
	}
}

void getSDCardStr(uint8_t *SDCardStr)
{
		FRESULT fres;   // FatFS 返回值
	   // 读取文件内容
    unsigned int bytesRead;
    // 打开文件
    fres = f_open(&fil, filePath, FA_READ);
    if (fres != FR_OK) {
        // 错误处理: 文件打开失败
    }
    fres = f_read(&fil, SDCardStr, sizeof(SDCardStr) - 1, &bytesRead);
    if (fres != FR_OK) {
        // 错误处理: 文件读取失败
    }

    // 确保字符串结束
    SDCardStr[bytesRead] = '\0';

    // 关闭文件
    f_close(&fil);
}

/*
 * 测试SD卡
 */
void setSDCardTest(void)
{
	/* 定义一个数组 */
	uint8_t setStr[100];
	/* 获取结束时间 */
	setTimeEnd();
	/* 把字符串数据存储到数组中 */
	setTimeStr(setStr, 0);
	/* 把数组中的数据存储到SD卡中 */
	setSDCardStr(setStr);
	
}


/* 读取红外的值 
 */
void readInfrared(void)
{
	/* 读取红外的值 */
	infraredState[0] = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1);
	infraredState[1] = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_0);
	infraredState[2] = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_3);
	infraredState[3] = HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_2);
	infraredState[4] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1);
	infraredState[5] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2);
	infraredState[6] = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3);
	infraredState[7] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
	infraredState[8] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
	infraredState[9] = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
	/* 读取到值，只能进行加1次 */
	if(infraredState[0] == 0 && (thisTime - lastTime[0] > 1000))
	{
		motorNum[0]++;
		lastTime[0] = thisTime;
	}
	if(infraredState[1] == 0 && (thisTime - lastTime[1] > 1000))
	{
		motorNum[1]++;
		lastTime[1] = thisTime;
	}
	if(infraredState[2] == 0 && (thisTime - lastTime[2] > 1000))
	{
		motorNum[2]++;
		lastTime[2] = thisTime;
	}
	if(infraredState[3] == 0 && (thisTime - lastTime[3] > 1000))
	{
		motorNum[3]++;
		lastTime[3] = thisTime;
	}
	if(infraredState[4] == 0 && (thisTime - lastTime[4] > 1000))
	{
		motorNum[4]++;
		lastTime[4] = thisTime;
	}
	if(infraredState[5] == 0 && (thisTime - lastTime[5] > 1000))
	{
		motorNum[5]++;
		lastTime[5] = thisTime;
	}
	if(infraredState[6] == 0 && (thisTime - lastTime[6] > 1000))
	{
		motorNum[6]++;
		lastTime[6] = thisTime;
	}
	if(infraredState[7] == 0 && (thisTime - lastTime[7] > 1000))
	{
		motorNum[7]++;
		lastTime[7] = thisTime;
	}
	if(infraredState[8] == 0 && (thisTime - lastTime[8] > 1000))
	{
		motorNum[8]++;
		lastTime[8] = thisTime;
	}
	if(infraredState[9] == 0 && (thisTime - lastTime[9] > 1000))
	{
		motorNum[9]++;
		lastTime[9] = thisTime;
	}
		
}

/* 十个红外的初始化 
 * 使用的GPIP引脚：PA1,PA2,PA3,PB0,PB1,PB2,PC0,PC1,PC2,PC3
 * 红外传感器的检测状态：1-未检测到，0-检测到
 * 需要设置的模式为：上拉输入
 */
void infrared_Init(void)
{
	/* 引脚初始化 */
	GPIO_InitTypeDef GPIO_Initure;

	/* 时钟初始化 */
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOB_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();

	/* 红外传感器引脚初始化 */
	GPIO_Initure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
	GPIO_Initure.Mode = GPIO_MODE_INPUT;
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOA, &GPIO_Initure);

	GPIO_Initure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
	GPIO_Initure.Mode = GPIO_MODE_INPUT;
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOB, &GPIO_Initure);

	GPIO_Initure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
	GPIO_Initure.Mode = GPIO_MODE_INPUT;
	GPIO_Initure.Pull = GPIO_PULLUP;
	GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
	HAL_GPIO_Init(GPIOC, &GPIO_Initure);

}
